package com.boc.ewr.risk.service.impl;

import com.boc.ewr.bcimp.entity.CaBalDtl;
import com.boc.ewr.bcimp.service.ICaBalDtlService;
import com.boc.ewr.risk.entity.EmpBrkFdbk;
import com.boc.ewr.risk.entity.SignMismatchFdbk;
import com.boc.ewr.risk.mapper.SignMismatchFdbkMapper;
import com.boc.ewr.risk.service.ISignMismatchFdbkService;
import com.boc.ewr.util.MsgCategoryEnum;
import com.boc.ewr.util.ToUserUtil;
import com.boc.ewr.util.file.enumeration.ReturnStatusEnum;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @Description: 对账印鉴不符清单
 * @Author: jeecg-boot
 * @Date: 2023-04-20
 * @Version: V1.0
 */
@Service
@Slf4j
public class SignMismatchFdbkServiceImpl extends ServiceImpl<SignMismatchFdbkMapper, SignMismatchFdbk> implements ISignMismatchFdbkService {

    @Autowired
    private ICaBalDtlService caBalDtlService;

    @Autowired
    private ISysBaseAPI sysBaseAPI;


    /**
     * 在批量导入余额对账单明细后中获取“对账单状态”为“印鉴不符 余额待确认 无效回执”的等无效回执清单
     * 直接推送至网点对账人员，提醒客户重新盖正确印鉴，如有不符情况说明可在线提交反馈。
     *
     * 有效对账状态:
     *      印鉴相符 余额相符 对账完成/
     *      印鉴相符 余额不符 已调整/
     *      印鉴不符 余额不符 已调整/
     *      再次验印相符 余额相符 已调整/
     *      再次验印相符 余额不符 已调整
     * 无效对账状态:
     *      己出账/已退信/回执期/逾期催收/
     *      暂缓发送/印鉴未登记 余额相符 回执完完成/
     *      印鉴未登记 余额不符 回执未完成/
     *      印鉴相符 余额不符 收到回执/
     *      再次验印相符 余额不符 收到回执/
     *      印鉴不符 余额待确认 无效回执/
     *      印鉴不符 余额不符 待确认回执/
     *      印鉴相符 余额不符 明细已录 收到回执/
     *      再次验印相符 余额不符 明细已录 收到回执/
     *      印鉴不符 余额不符 明细已录 待确认回执/
     *      印鉴相符 余额不符 待复核/
     *      再次验印相符 余额不符 待复核/
     *      印鉴不符 余额不符 待复核/
     *      印鉴相符 余额不符 退回调整/
     *      印鉴不符 余额不符 退回调整/
     *      再次验印相符 余额不符 退回调整
     */

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean createInfo() {
        //清空当前记录
        //this.remove(null);

        //生成数据
        List<CaBalDtl> caBalDtlList = caBalDtlService.list();
        // 有效对账状态List
        Set<String> validIndexSet = ReturnStatusEnum.getValidIndexSet();
        /*List<String> validCaStatusList = new ArrayList<>();
        validCaStatusList.add(ReturnStatusEnum.STATUS14.getIndex());
        validCaStatusList.add(ReturnStatusEnum.STATUS15.getIndex());
        validCaStatusList.add(ReturnStatusEnum.STATUS20.getIndex());
        validCaStatusList.add(ReturnStatusEnum.STATUS25.getIndex());
        validCaStatusList.add(ReturnStatusEnum.STATUS13.getIndex());*/

        List<SignMismatchFdbk> signMismatchFdbkList = new ArrayList<>();
        for (CaBalDtl caBalDtl : caBalDtlList) {
            // 如果属于有效对账状态，则直接跳过
            if (validIndexSet.contains(caBalDtl.getCaSta())) {
                continue;
            }
            SignMismatchFdbk signMismatchFdbk = new SignMismatchFdbk();
            BeanUtils.copyProperties(caBalDtl, signMismatchFdbk);
            //为了防止出现导入ID出现重复，需要把对账印鉴不符清单ID置空
            signMismatchFdbk.setId(null);
            signMismatchFdbkList.add(signMismatchFdbk);
        }
        log.info("功能：对账印鉴不符清单，插入数据量为{}！", signMismatchFdbkList.size());
        this.sendMsg(signMismatchFdbkList);
        return this.saveBatch(signMismatchFdbkList);
    }

    private void sendMsg(Collection<SignMismatchFdbk> entityList) {

        Set<String> orgSet = new HashSet();
        for (SignMismatchFdbk signMismatchFdbk : entityList) {
            orgSet.add(signMismatchFdbk.getObranchNo());
        }

        // 信息推送至网点对账人员
        String toUser = ToUserUtil.genToUser(orgSet);

        if (toUser != null) {
            MessageDTO messageDTO = new MessageDTO(
                    "system",
                    toUser,
                    "对账印鉴不符",
                    "余额对账单明细中存在无效回执清单，请您及时查看并完成排查，并提醒客户重新盖正确印鉴",
                    MsgCategoryEnum.RISK_CHECK.getIndex());
            sysBaseAPI.sendSysAnnouncement(messageDTO);
        }
    }
}
